home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / gui / precog2_1.lha / Precognition2_1 / src / src.lha / Library / PObject.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-09  |  3.1 KB  |  160 lines

  1. /* ==========================================================================
  2. **
  3. **                               PObject.c
  4. **
  5. **   ©1991 WILLISoft
  6. **
  7. ** ==========================================================================
  8. */
  9.  
  10. #include <exec/types.h>
  11. #include "PObject.h"
  12. #include "PObjectClass.h"
  13. #include "stdlib.h"
  14. #include "AmigaMem.h"
  15.  
  16. /* EDB -- added version string */
  17. char *precognition_lib_version = "$VER: precognition.lib 2.1 (9.1.95)";
  18.    /*
  19.    ** This string needs to be in there somewhere for the
  20.    ** AmigaDOS VERSION command to find it.
  21.    */
  22.  
  23. void SetObjectName( PObject *self, char *name );
  24.  
  25. #ifdef VERBOSE
  26. void DumpClassChain( struct PObjectClass *class )
  27. {
  28.    for( ; class != NULL; class = class->isa )
  29.    {
  30.       printf( "%s", class->ClassName );
  31.       if( class->isa ) printf( "->" );
  32.    }
  33.    printf("\n");
  34. }
  35. #endif
  36.  
  37.  
  38. void PObject_CleanUp( PObject *self )
  39. {
  40.    SetObjectName( self, NULL );
  41. }
  42.  
  43.  
  44.  
  45. void CleanUp( PObject *self )
  46. {
  47.    const struct PObjectClass *class;
  48.    void *prev_cleaner = NULL;
  49.  
  50.  
  51.    if( self )
  52.    {
  53.       /* call cleanup routines for entire parent hierarchy. */
  54.       for( class = (struct PObjectClass *)self->isa;
  55.            class != NULL;
  56.            class = class->isa )
  57.       {
  58.          if( class->CleanUp )
  59.          {
  60.             if( (void *)class->CleanUp != prev_cleaner )
  61.             {
  62.                (*class->CleanUp)( self );
  63.                prev_cleaner = (void *)class->CleanUp;
  64.             }
  65.          }
  66.       }
  67.    }
  68. }
  69.  
  70.  
  71. char *ClassName( PObject *self )
  72. {
  73.    struct PObjectClass *class;
  74.    char *name = NULL;
  75.  
  76.    if( self )
  77.       if( class = (struct PObjectClass *)self->isa )
  78.          name = class->ClassName;
  79.  
  80.    return name;
  81. }
  82.  
  83. BOOL isa( PObject *self,
  84.           const PClass   *class )
  85. {
  86.    const struct PObjectClass *self_class;
  87.    struct PObjectClass *c;
  88.  
  89.    c = (struct PObjectClass *)class;
  90.    if( self )
  91.    {
  92.       /* Traverse inheritence tree of self. */
  93.       for ( self_class  = self->isa;
  94.             self_class != NULL;
  95.             self_class  = self_class->isa )
  96.       {
  97.          /*printf("isa(\"%s\", \"%s\")\n",*/
  98.          /*   self_class->ClassName, c->ClassName );*/
  99.  
  100.          if( self_class->ClassName == c->ClassName )
  101.          {
  102.             /*printf("Match!\n");*/
  103.             return TRUE;
  104.          }
  105.       }
  106.    }
  107.  
  108.    /*printf("No Match.\n");*/
  109.    return FALSE;
  110. }
  111.  
  112.  
  113. char *ObjectName( PObject *self )
  114. {
  115.    if( self ) return self->PObjectName;
  116.    return NULL;
  117. }
  118.  
  119. char *PObjectName( PObject *self )
  120. {
  121.    return ObjectName( self );
  122. }
  123.  
  124. void SetObjectName( PObject *self, char *name )
  125. {
  126.    if( self == NULL )return;
  127.  
  128.    Afree( self->PObjectName );
  129.    self->PObjectName = Astrdup( name );
  130. }
  131.  
  132. BOOL PObject_elaborated = FALSE;
  133.  
  134. struct PObjectClass PObject_Class;
  135.  
  136. void PObjectClass_Init( struct PObjectClass *class )
  137. {
  138.    class->isa        = NULL;
  139.    class->ClassName  = "PObject";
  140.    class->CleanUp    = PObject_CleanUp;
  141. }
  142.  
  143.  
  144. const struct PObjectClass *PObjectClass( void )
  145. {
  146.    if( ! PObject_elaborated )
  147.    {
  148.       PObjectClass_Init( &PObject_Class );
  149.       PObject_elaborated = TRUE;
  150.    }
  151.  
  152.    return &PObject_Class;
  153. }
  154.  
  155. void PObject_Init( PObject *self )
  156. {
  157.    self->isa         = PObjectClass();
  158.    self->PObjectName = NULL;
  159. }
  160.